package org.example.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.example.model.Article;
import org.example.model.User;
import org.junit.Test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class WebUtil {

    //单例模式：饿汉式写法
    private static final ObjectMapper MAPPER = new ObjectMapper();

    static {
        //初始化时，设置objectMapper的日期格式化
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        MAPPER.setDateFormat(df);
    }

    /**
     * 封装Session校验：访问敏感资源需要验证是否登录
     * 返回值如何设计：1.boolean（但是这样拿不到登录时保存的用户信息）
     * 2.返回登录时保存的用户信息：User
     * 此时又可以设计为，已登录返回user，没有登录返回null或者返回错误信息（如响应状态码401）
     * 我们这里简单返回null，在servlet处理返回
     */
    public static User validateLogin(HttpServletRequest req) {
        HttpSession session = req.getSession(false);
        User user = null;
        if (session != null) {
            //这里是提前写了获取会话中的用户信息，登录时注意要保存相同的键
            user = (User) session.getAttribute("user");
        }
        return user;
    }

    /**
     * 序列化：用于返回响应数据，把Java对象转为json字符串
     * 因为都是返回json，所以都是设置Content-Type为application/json
     * 编码格式为UTF-8
     */
    public static void serialize(HttpServletResponse resp, Object o) {
        try {
            resp.setContentType("application/json");
            resp.setCharacterEncoding("UTF-8");
            String body = MAPPER.writeValueAsString(o);
            resp.getWriter().write(body);
        } catch (IOException e) {
            throw new RuntimeException("json序列化出错", e);
        }
    }

    /**
     * 反序列化：把请求正文中的json字符串，转换为Java对象
     */
    public static <T> T deserialize(HttpServletRequest req, Class<T> clazz) {
        try {
            return MAPPER.readValue(req.getInputStream(), clazz);
        } catch (IOException e) {
            throw new RuntimeException("json反序列化出错", e);
        }
    }

    @Test
    public void 测试一下带日期的序列化() throws JsonProcessingException {
        Article a = new Article();
        a.setId(1);
        a.setTitle("这是标题");
        a.setContent("这是正文");
        a.setCreateTime(new Date());
        a.setUserId(2);
        String json = MAPPER.writeValueAsString(a);
        System.out.println(json);
    }

    @Test
    public void 使用日期格式化类() {
        Date d = new Date();
        //日期格式化类，用于Date和日期字符串互相转换
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = df.format(d);
        System.out.println(dateString);
    }
}
